//package com.kiki.goodsRecommend;
//
//public class RecommendationSystem {
//
//    // 用户-项目评分数据,0表示未评分
//    private static final int[][] ratings = {
//            {1,3,5, 5, 5, 5, 5},//用户1对项目1、2、3、4、5的评分
//            {5, 0, 0, 4, 5, 5, 0},
//            {5, 0, 0, 5, 2, 0, 0},
//            {5, 3, 5, 2, 5, 0, 0},
//    };
//
//    private static final int numUsers = ratings.length;// 6个用户数量
//    private static final int numItems = ratings[0].length;//5个项目数量
//
//    public static void main(String[] args) {
//        // 计算相似度矩阵
//        double[][] similarityMatrix = calculateSimilarityMatrix();
//
//        // 进行推荐
//        recommend(1, similarityMatrix);
//    }
//
//    // 计算用户之间的相似度矩阵
//    private static double[][] calculateSimilarityMatrix() {
//        double[][] similarityMatrix = new double[numUsers][numUsers];
//
//        for (int i = 0; i < numUsers; i++) {
//            for (int j = i + 1; j < numUsers; j++) {
//                double similarity = calculateSimilarity(ratings[i], ratings[j]);
//                //这里的相似度矩阵中，相当于a[i][j]和a[j][i]是同一个值，对称矩阵，无论是a[i][j]还是a[j][i]都是记录着用户i和用户j之间的相似度
//                similarityMatrix[i][j] = similarity;//用户i和用户j之间的相似度
//                similarityMatrix[j][i] = similarity;
//            }
//        }
//
//        return similarityMatrix;
//    }
//
//    // 计算两个用户之间的相似度
//    public static double calculateSimilarity(int[] user1, int[] user2) {
//        double sum = 0.0;
//        int count = 0;
//
//        // 计算各个评分的平方差
//        for (int i = 0; i < numItems; i++) {
//            //两者评论不为零
//            if (user1[i] != 0 && user2[i] != 0) {
//                sum += Math.pow(user1[i] - user2[i], 2);
//                count++;
//            }
//        }
//
//        // 如果两个用户没有共同评分，则相似度为0
//        if (count == 0) {
//            return 0.0;
//        }
//        return 1.0 / (1.0 + Math.sqrt(sum));// 皮尔逊相关系数，值越接近1，相似度越高
//    }
//
//    // 为指定用户进行推荐
//    private static void recommend(int userId, double[][] similarityMatrix) {
//        double[] weightedSum = new double[numItems];// 评分加权值总合，是所有相似用户的评分加权和
//        double[] similaritySum = new double[numItems];// 用户相似度总合，所有相似用户的相似度之和
//        //最后使用weightedSum/similaritySum来得到userId对产品的预测评分，实现是否推荐
//
//        for (int i = 0; i < numUsers; i++) {
//            if (i != userId) {//用户自己不计算
//                for (int j = 0; j < numItems; j++) {
//                    //条件是id为[userId]的用户未评分，其他用户[i]已评分，对比这些相似用户
//                    if (ratings[userId][j] == 0 && ratings[i][j] != 0) {
//                        //获取不同用户在同一商品上的评分与其用户相似度的乘积，similarityMatrix[userId][i]表示用户userId与用户i之间的相似度
//                        weightedSum[j] += ratings[i][j] * similarityMatrix[userId][i];
//                        //计算相似度之和
//                        similaritySum[j] += similarityMatrix[userId][i];
////                        System.out.println("输出相似度："+similarityMatrix[userId][i]);
//                    }
//                }
//            }
//        }
//
//        System.out.println("推荐给用户 " + userId + " 的项目：");
//        for (int i = 0; i < numItems; i++) {
//            //如果这个是用户未评分，且相似度不为0(即对i产品有共同兴趣的人群)，则可以进行计算推荐
//            if (ratings[userId][i] == 0 && similaritySum[i] != 0) {
////                System.out.println("输出相似度"+similaritySum[i]);
//                double predictedRating = weightedSum[i] / similaritySum[i];// 计算预测评分，即加权平均值
//                System.out.println("项目 " + i + "，预测评分：" + predictedRating);
//            }
//        }
//    }
//}
